package sessionBean;

import java.util.ArrayList;

import javax.ejb.Remote;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.EntityNotFoundException;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import entityBean.Attrazione;
import entityBean.Hotel;
import entityBean.Operatore;
import entityBean.Volo;

/**
 * Session Bean implementation class GestoreOpBTP
 */
@Stateless(name="GestoreOpBTP")
@Remote(GestoreOpBTPRemote.class)
public class GestoreOpBTP implements GestoreOpBTPRemote {

	@PersistenceContext(name="cvproject")
	private EntityManager manager;

	/**
	 * Default constructor. 
	 */
	public GestoreOpBTP() {
		// TODO Auto-generated constructor stub
	}

	private Operatore getOperatore(String codice) {

		//Prelevo le informazioni dell'operatore

		Operatore o = manager.find(Operatore.class, codice);

		//Prelevo tutte le BTP legate a quell'operatore

		String s = "FROM hotel h WHERE h.codiceop=:op";
		Query q = manager.createQuery(s);
		q.setParameter("op", codice);

		ArrayList<Hotel> hotels = new ArrayList<Hotel>(q.getResultList());

		s = "FROM volo v WHERE v.codoperatore=:op";
		q = manager.createQuery(s);
		q.setParameter("op", codice);

		ArrayList<Volo> voli = new ArrayList<Volo>(q.getResultList());

		s = "FROM attrazione a WHERE a.codiceop=:op";
		q = manager.createQuery(s);
		q.setParameter("op", codice);

		ArrayList<Attrazione> att = new ArrayList<Attrazione>(q.getResultList());

		o.setHotel(hotels);
		o.setVoli(voli);
		o.setAtt(att);
		
		return o;

	}

	@Override
	public Operatore insHotel(Hotel h) {

		//Verifico se esiste già un hotel con quelle caratteristiche
		Hotel hotel = manager.find(Hotel.class, h.getCodHotel());

		if(hotel != null) {

			//esiste già quell'hotel
			return null;

		}
		
		//inserisco l'hotel
		
		manager.persist(h);

		return getOperatore(h.getCodiceOp());
	}

	@Override
	public Operatore insVolo(Volo v) {
		
		Volo volo = manager.find(Volo.class, v.getCodVolo());
		
		if(volo != null) {
			
			return null;
			
		}
		
		manager.persist(v);
		
		return getOperatore(v.getCodOp());
	}

	@Override
	public Operatore insAttrazione(Attrazione a) {
		
		try {
			
			String s = "FROM attrazione a WHERE a.nome=:nome and a.città=:città";
			Query q = manager.createQuery(s);
			q.setParameter("nome", a.getNome());
			q.setParameter("città", a.getCittà());
			
			Attrazione att = (Attrazione) q.getSingleResult();
			
			//Ho trovato un'attrazone uguale già presente nel db
			return null;
			
		}
		catch(EntityNotFoundException e) {
			
			manager.persist(a);
			
			return getOperatore(a.getCodOp());
			
		}
	
	}

}
